package com.colabo.j2ee.web.oaf.orgnization;

import java.util.List;
import java.util.Map;

import com.colabo.j2ee.web.core.exception.CommonException;
import com.colabo.j2ee.web.core.exception.ServiceException;
import com.colabo.j2ee.web.oaf.orgnization.model.IPPositionVO;
import com.colabo.j2ee.web.oaf.orgnization.model.SCUserProfileVO;
import com.colabo.j2ee.web.oaf.orgnization.model.SCUnitProfileVO;
import com.colabo.j2ee.web.oaf.orgnization.util.ValidateResult;
import com.colabo.j2ee.web.oaf.security.model.SCUserSecurityVO;

public interface IStaffService {
	String BEAN_ID = "staffService";

	/**
	 * 根据员工Id取得员工对象
	 * 
	 * @param staffid
	 * @return 员工对象
	 * @throws ServiceException
	 */
	SCUserProfileVO getStaffByStaffId(String staffid) throws ServiceException;

	/**
	 * 取得所有员工对象列表
	 * 
	 * @param offset
	 * @param pageSize
	 * @return List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	List getAllStaffs(int offset, int pageSize) throws ServiceException;

	/**
	 * 取得员工总数, 一般用于员工维护中显示总记录数
	 * 
	 * @return 员工总数
	 * @throws ServiceException
	 */
	int getAllStaffCount() throws ServiceException;

	/**
	 * 根据unit字段取单位员工
	 * 
	 * @param unit
	 * @return List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	List getStaffsByUnit(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 根据unit字段取单位员工, 带分页功能
	 * 
	 * @param unit
	 * @param offset
	 * @param pageSize
	 * @return List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	List getStaffsByUnit(SCUnitProfileVO unit, int offset, int pageSize) throws ServiceException;

	/**
	 * 根据unit字段取单位员工总数, 用于分页时显示总记录数
	 * 
	 * @param unit
	 * @return 员工总数
	 * @throws ServiceException
	 */
	int getStaffCountByUnit(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 查找机构unit中的人员, 将拥有position的人员ext1字段设置为positionid
	 * 
	 * @param unit
	 * @param position
	 * @param offset
	 * @param pageSize
	 * @return
	 * @throws ServiceException
	 */
	List getStaffByUnitSelectByPosition(SCUnitProfileVO unit, IPPositionVO position, int offset, int pageSize)
			throws ServiceException;

	int getStaffCountByUnitSelectByPosition(SCUnitProfileVO unit, IPPositionVO position) throws ServiceException;

	/**
	 * 根据ownerUnit取单位员工, 一般用于定岗时取机构下所有员工
	 * 
	 * @param unit
	 * @return List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	List getStaffsByOwnerUnit(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 根据ownerUnit取单位员工, 一般用于定岗时取机构下所有员工, 带分页功能
	 * 
	 * @param unit
	 * @param offset
	 * @param pageSize
	 * @return List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	List getStaffsByOwnerUnit(SCUnitProfileVO unit, int offset, int pageSize) throws ServiceException;

	/**
	 * 取得机构下所有员工总数, 用于分页查询机构下员工时显示员工总数
	 * 
	 * @param unit
	 * @return 属于某机构员工总数
	 * @throws ServiceException
	 */
	int getStaffCountByOwnerUnit(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 根据职位取得定岗的人员
	 * 
	 * @param position
	 * @return
	 * @throws ServiceException
	 */
	List getStaffsByPosition(IPPositionVO position) throws ServiceException;

	/**
	 * 根据职位取得定岗的人员, 带分页功能
	 * 
	 * @param position
	 * @param offset
	 * @param pageSize
	 * @return List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	List getStaffsByPosition(IPPositionVO position, int offset, int pageSize) throws ServiceException;

	/**
	 * 取得职位下人员总数
	 * 
	 * @param position
	 * @return 职位下人员总数
	 * @throws ServiceException
	 */
	int getStaffCountByPosition(IPPositionVO position) throws ServiceException;

	/**
	 * 根据职位以及查询条件取得定岗的人员, 带分页功能
	 * 
	 * @param params
	 * @param offset
	 * @param pageSize
	 * @return List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	public List queryStaffsByPosition(Map params, int offset, int pageSize) throws ServiceException;

	/**
	 * 取得职位下对应查询条件的人员总数
	 * 
	 * @param params
	 * @return 职位下人员总数
	 * @throws ServiceException
	 */
	public int queryStaffCountByPosition(Map params) throws ServiceException;

	/**
	 * 根据职位以及查询条件取得定岗的人员, 带分页功能
	 * 
	 * @param params
	 * @param offset
	 * @param pageSize
	 * @return List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	public List queryAllStaffsByPosition(Map params, int offset, int pageSize) throws ServiceException;

	/**
	 * 取得职位下对应查询条件的人员总数
	 * 
	 * @param params
	 * @return 职位下人员总数
	 * @throws ServiceException
	 */
	public int queryAllStaffCountByPosition(Map params) throws ServiceException;

	/**
	 * 批量保存人员信息
	 * 
	 * @param insertBeans
	 *            List<SCUserProfileVO>
	 * @param updateBeans
	 *            List<SCUserProfileVO>
	 * @param delBeans
	 *            List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	String batchCommit(List insertBeans, List updateBeans, List delBeans) throws ServiceException, CommonException;

	/**
	 * 批量验证人员数据合法性, 用于批量保存人员信息前对要保存的数据进行验证.
	 * 
	 * @param insertBeans
	 * @param updateBeans
	 * @param delBeans
	 * @return 验证结果
	 * @throws ServiceException
	 */
	ValidateResult batchValidate(List insertBeans, List updateBeans, List delBeans) throws ServiceException;

	/**
	 * 根据默认职位取人员, 一般用于组织中存在默认岗位时取默认人员, 若没有默认岗位返回空List
	 * 
	 * @param unit
	 * @return
	 * @throws ServiceException
	 */
	List getStaffsByDefaultPositionInUnit(SCUnitProfileVO unit) throws ServiceException;

	/**
	 * 根据条件查询不在某个岗位的员工数据
	 * 
	 * @param params
	 * @param offset
	 * @param pageSize
	 * @return List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	public List queryStaffNotInPosition(Map params, int offset, int pageSize) throws ServiceException;

	/**
	 * 查询结果返回的记录总数, 若查询结果需要分类, 通过这个方法得到查询总人数
	 * 
	 * @param params
	 * @return 查询结果总数
	 * @throws ServiceException
	 */
	public int queryStaffCountNotInPosition(Map params) throws ServiceException;

	/**
	 * 根据条件查询员工数据, map中key值为SCUserProfileVO中属性名称, 值为需要查询的值, 编码通过等于连接, 多个条件通过and连接
	 * 支持查询以下字段: staffid staffName 模糊查询 unitid unitName 模糊查询 ownerUnitid
	 * ownerUnitName 模糊查询 positionid
	 * 
	 * kind adminLevel status idNumber sex tel email address
	 * 
	 * @param params
	 * @param offset
	 * @param pageSize
	 * @return List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	List query(Map params, int offset, int pageSize) throws ServiceException;

	/**
	 * 查询结果返回的记录总数, 若查询结果需要分类, 通过这个方法得到查询总人数
	 * 
	 * @param params
	 * @return 查询结果总数
	 * @throws ServiceException
	 */
	int queryCount(Map params) throws ServiceException;

	/**
	 * 此方法为选择‘包含子目录’时调用 根据条件查询某组织下包含子组织的所有人员
	 * 
	 * @param params
	 * @param offset
	 * @param pageSize
	 * @return List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	List queryAll(Map params, int offset, int pageSize) throws ServiceException;

	/**
	 * 查询结果返回的记录总数, 若查询结果需要分页, 通过这个方法得到查询总人数
	 * 
	 * @param params
	 * @return
	 * @throws ServiceException
	 */
	int queryAllCount(Map params) throws ServiceException;

	/**
	 * 根据条件staffid查询authuser
	 * 
	 * @param params
	 * @return List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	public SCUserSecurityVO findAuthUserByStaffid(String staffid) throws ServiceException;

	/**
	 * 根据应用判断是否存在人员
	 * 
	 * @param unitcode
	 * @return
	 */
	public boolean isExist(String staffcode) throws ServiceException;

	/**
	 * 判断此人员是否拥有此岗位
	 * 
	 * @param staffid
	 * @param positionid
	 * @return
	 * @throws ServiceException
	 */
	public boolean isExistPosition(String staffid, String positionid) throws ServiceException;

	/**
	 * 根据staffid和positionid逻辑删除
	 * 
	 * @param staffid
	 * @param positionid
	 * @return
	 * @throws ServiceException
	 */
	public boolean delDutyByStaffidAndPosiid(String staffid, String positionid) throws ServiceException;

	/**
	 * 增加人员
	 * 
	 * @param vo
	 * @return SCUserProfileVO对象的主键
	 * @throws ServiceException
	 */
	public String addStaff(SCUserProfileVO vo) throws ServiceException;

	/**
	 * 修改人员信息
	 * 
	 * @param voList
	 *            list里面存放的对象SCUserProfileVO
	 * @return
	 * @throws ServiceException
	 */
	public int updateStaffList(List voList) throws ServiceException;

	/**
	 * 删除人员信息，逻辑删除
	 * 
	 * @param voList
	 *            list里面存放的对象SCUserProfileVO
	 * @return
	 * @throws ServiceException
	 */
	public int deleteStaffList(List voList) throws ServiceException;

	List queryStaffInfo(Map params, int offset, int pageSize) throws ServiceException;

	/**
	 * 查询结果返回的记录总数, 若查询结果需要分类, 通过这个方法得到查询总人数
	 * 
	 * @param params
	 * @return 查询结果总数
	 * @throws ServiceException
	 */
	int queryStaffInfoCount(Map params) throws ServiceException;

	public long getMaxIndexNo() throws ServiceException;

	public List listNoOrgStaff(Map params) throws ServiceException;

	public void updateStaffOrg(List staffIdList, String unitId, String userId) throws ServiceException;

	/**
	 * 批量增加、删除、修改代理信息
	 * 
	 * @param insertBeans
	 * @param updateBeans
	 * @param delBeans
	 * @return
	 */
	public int batchCommitDevelope(List insertBeans, List updateBeans, List delBeans) throws ServiceException;

	public List queryDevelope(String staffid) throws ServiceException;

	/**
	 * 保存员工信息，如果系统中已存在该员工，则修改其信息，如果不存在，则删除其信息
	 * 
	 * @param staff
	 *            员工对象
	 * @return 保存是否成功
	 * @throws ServiceException
	 * @throws CommonException
	 */
	public String save(SCUserProfileVO staff) throws ServiceException, CommonException;
	
	/**
	 * 根据条件查询已删除的员工数据, map中key值为SCUserProfileVO中属性名称, 值为需要查询的值, 编码通过等于连接, 多个条件通过and连接
	 * 支持查询以下字段: staffid staffName 模糊查询 unitid unitName 模糊查询 ownerUnitid
	 * ownerUnitName 模糊查询 positionid
	 * 
	 * kind adminLevel status idNumber sex tel email address
	 * 
	 * @param params
	 * @param offset
	 * @param pageSize
	 * @return List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	List queryBack(Map params, int offset, int pageSize) throws ServiceException;
	
	/**
	 * 查询结果返回已删除的员工记录总数, 若查询结果需要分类, 通过这个方法得到查询总人数
	 * 
	 * @param params
	 * @return 查询结果总数
	 * @throws ServiceException
	 */
	int queryBackCount(Map params) throws ServiceException;
	
	/**
	 * 此方法为选择‘包含子目录’时调用 根据条件查询某组织下包含子组织的所有已删除人员
	 * 
	 * @param params
	 * @param offset
	 * @param pageSize
	 * @return List<SCUserProfileVO>
	 * @throws ServiceException
	 */
	List queryBackAll(Map params, int offset, int pageSize) throws ServiceException;
	
	/**
	 * 查询结果返回已删除的员工记录总数, 若查询结果需要分页, 通过这个方法得到查询总人数
	 * 
	 * @param params
	 * @return
	 * @throws ServiceException
	 */
	int queryBackAllCount(Map params) throws ServiceException;
	
	/**
	 * 批量还原人员
	 * @param backBeans 待还原的人员列表
	 * @return
	 * @throws ServiceException
	 * @throws CommonException
	 */
	public String saveBackToStaff(List backBeans) throws ServiceException ,CommonException;
	
	/**
	 * 批量删除人员，这里的删除是物理删除，删除后，数据库中不再存在数据
	 * @param delBeans 待删除的人员列表
	 * @return
	 * @throws ServiceException
	 * @throws CommonException
	 */
	public String saveFullDel(List delBeans) throws ServiceException ,CommonException;
}
